package cc.magicjson.example.demo.exam;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.*;
import java.util.concurrent.Future;

public class HierarchicalJsonBuilder {

    public static void main(String[] args) {
        String inputJson = "[{\"key\":1,\"value\":\"alibaba\"},{\"key\":11,\"value\":\"aliyun\"},{\"key\":111,\"value\":\"gts\"},{\"key\":112,\"value\":\"cse\"},{\"key\":12,\"value\":\"taotian\"},{\"key\":121,\"value\":\"tmall\"}]";
        String hierarchicalJson = buildHierarchicalJson(inputJson);
        System.out.println(hierarchicalJson);
    }

    public static String buildHierarchicalJson(String inputJson) {
        // 解析输入的 JSON 数组
        JSONArray jsonArray = JSONArray.parseArray(inputJson);

        JSONObject root = new JSONObject();

        // 使用 TreeMap 来自动排序，以便构建层次结构
        Map<Integer, JSONObject> map = new TreeMap<>();

        // 初始化所有节点
        for (Object obj : jsonArray) {
            JSONObject jsonObject = (JSONObject) obj;
            int key = jsonObject.getInteger("key");
            jsonObject.put("children", new JSONArray()); // 初始化 children 数组
            map.put(key, jsonObject);
        }

        // 构建层次结构
        for (Map.Entry<Integer, JSONObject> entry : map.entrySet()) {
            int key = entry.getKey();
            int parentKey = getParentKey(key);
            if (parentKey == 0) {
                // 根节点
                root = map.get(key);
            } else {
                // 将当前节点添加到其父节点的 children 数组中
                map.get(parentKey).getJSONArray("children").add(entry.getValue());
            }
        }

//        // 找到并返回根节点
//        for (JSONObject root : map.values()) {
//            if (root.getInteger("key") == 1) {
//                return root.toJSONString();
//            }
//        }

        return root.toJSONString(); // 如果没有找到根节点，返回 null
    }

    interface ITask{
        List<Future> task = new ArrayList<>();
        void run();
    }

    private static int getParentKey(int key) {
        return key / 10;
    }
}